home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / dsp / dspgroup / asms.arc / TIFFT.ASM < prev    next >
Encoding:
Assembly Source File  |  1987-04-13  |  5.2 KB  |  239 lines

  1. *
  2. *    Cooley-Tukey Radix-2, DIF FFT Program for the TMS32010.
  3. *
  4. *    Single FFT butterfly.
  5. *    Complex input data - size limited only by program memory availability.
  6. *    Uses table lookup of the twiddle factors.
  7. *    No scaling is done on intermediate values in the program.
  8. *    External data RAM is addressed via peripheral I/O instructions.
  9. *         An address counter is required and is loaded by a write to
  10. *         port 0.  Data is read from and written to RAM via port 1.
  11. *         The address counter should increment after every read or write.
  12. *    Data in the external RAM assumes complex data with corresponding
  13. *         real and imaginary data values in consecutive locations.
  14. *
  15. *
  16. * N is the size of the transform.  N = 2**M.
  17. N EQU 64
  18. M EQU 6
  19. *
  20. * Data Memory Allocation.
  21. *
  22. XI    EQU 0        * Array value X(I)
  23. YI    EQU 1        * Array value Y(I)
  24. XL    EQU 2        * Array value X(L)
  25. YL    EQU 3        * Array value Y(L)
  26. XT    EQU 4        * Temporary - real part
  27. YT    EQU 5        * Temporary - imaginary part
  28. I    EQU 6        * 1st index
  29. L    EQU 7        * 2nd index
  30. COS    EQU 8        * Twiddle factor - real part
  31. SIN    EQU 9        * Twiddle factor - imaginary part
  32. IA    EQU 10        * Index to twiddle factors
  33. IE    EQU 11        * Increment to IA
  34. HOLDN    EQU 12        * Contains value N
  35. QUARTN    EQU 13        * Contains value N/4
  36. N1    EQU 14        * Increment to I.
  37. N2    EQU 15        * Separation of I and L
  38. J    EQU 16        * Loop counter
  39. ONE    EQU 17        * Contains value 1
  40. TABLE    EQU 18        * Location of coefficient table
  41. *
  42. * Begin program memory section.
  43. *
  44.       ORG 0
  45. START      LDPK 0
  46.       LACK 1
  47.       SACL ONE          * Initialize IE = 1
  48.       SACL IE
  49.       LT   ONE
  50.       MPYK SINE
  51.       PAC
  52.       SACL TABLE          * Table has address of cosine table
  53.       MPYK N
  54.       PAC
  55.       SACL HOLDN          * Holdn = N
  56.       SACL N2          * Initialize N2 = N
  57.       LAC  HOLDN,14
  58.       SACH QUARTN          * Quartn = N/4
  59.       LARK AR0,M-1          * AR0 contains K counter
  60. KLOOP         LARP 1
  61.          LAC  N2,15
  62.          SACH N1,1          * N1 = N2
  63.          SACH N2          * N2 = N2/2
  64.          ZAC
  65.          SACL IA
  66.          SACL J
  67.          LAR  AR1,N2      * AR1 contains J value
  68.          MAR  *-          * Start at N2-1
  69. JLOOP        LAC  TABLE    * Table is full size
  70.         ADD  IA
  71.         TBLR SIN       * Get twiddle factors
  72.         ADD  QUARTN
  73.         TBLR COS
  74.         LAC  IA
  75.         ADD  IE
  76.         SACL IA       * IA =  IA + IE
  77.         LAC  J,1
  78.         SACL I          * I = J  (data organized as real value followed
  79. *                  * by imaginary so address I is 2 times J).
  80. ILOOP           LAC    I
  81.            ADD    N2,1        * L = I + N2
  82.            SACL L
  83. *
  84.            OUT    I,PA0        * Output address of XI
  85.            IN    XI,PA1        * Read real and imaginary parts
  86.            IN    YI,PA1
  87.            OUT    L,PA0        * Output address of XL
  88.            IN    XL,PA1        * Read real and imaginary parts
  89.            IN    YL,PA1
  90. *
  91. * Compute butterfly.
  92. *
  93.            LAC    XI
  94.            SUB    XL
  95.            SACL XT        * XT = XI - XL
  96.            ADD    XL,1
  97.            SACL XI        * XI = XI + XL
  98.            LAC    YI
  99.            SUB    YL
  100.            SACL YT        * YT = YI - YL
  101.            ADD    YL,1
  102.            SACL YI        * YI = YI + YL
  103.            LT    COS
  104.            MPY    YT
  105.            PAC
  106.            LT    SIN
  107.            MPY    XT
  108.            SPAC
  109.            SACH YL,1        * YL = COS*YT - SIN*XT
  110.            MPY    YT
  111.            PAC
  112.            LT    COS
  113.            MPY    XT
  114.            APAC
  115.            SACH XL,1        * XL = COS*XT + SIN*YT
  116. *
  117. * Output results of the butterfly.
  118. *
  119.            OUT    I,PA0        * Output I value address.
  120.            OUT    XI,PA1        * Output real and imaginary parts.
  121.            OUT    YI,PA1
  122.            OUT    L,PA0        * Output L value address.
  123.            OUT    XL,PA1        * Output real and imaginary parts.
  124.            OUT    YL,PA1
  125. *
  126. * Add increment for next loop.
  127. *
  128.            LAC    I
  129.            ADD    N1,1        * I = I + N1
  130.            SACL I
  131.            SUB    HOLDN,1     * While I < N
  132.            BLZ    ILOOP
  133.            LAC  J
  134.            ADD  ONE         * J = J + 1
  135.            SACL J
  136.            BANZ JLOOP
  137.         LAC  IE,1
  138.         SACL IE            * IE = 2 * IE
  139.         LARP 0
  140.         BANZ KLOOP
  141. *
  142. * Digit reverse counter for radix-2 FFT computation.
  143. *
  144. DRC2    ZAC
  145.     SACL L
  146.     SACL I
  147.     LARP 0
  148.     LAR  AR0,HOLDN            * For I = 0 to N-2
  149.     MAR  *-
  150.     MAR  *-
  151. DRLOOP        SUB  L            * If I < L, then swap
  152.         BGEZ NOSWAP
  153. * Swap i and l values.
  154.             OUT  I,PA0
  155.             IN   XI,PA1
  156.             IN   YI,PA1
  157.             OUT  L,PA0
  158.             IN   XL,PA1
  159.             IN   YL,PA1
  160.             OUT  L,PA0
  161.             OUT  XI,PA1
  162.             OUT  YI,PA1
  163.             OUT  I,PA0
  164.             OUT  XL,PA1
  165.             OUT  YL,PA1
  166. NOSWAP        LAC  HOLDN
  167.         SACL J                * J = N
  168. INLOOP            LAC  L
  169.             SUB  J            * If L >= J then
  170.             BLZ  OUTL
  171.                 SACL L        * L = L - J
  172.                 LAC  J,15
  173.                 SACH J        * J = J/2.
  174.                 B    INLOOP
  175. OUTL        ADD  J,1
  176.         SACL L                * L = L + J
  177.         LAC  I
  178.         ADD  ONE,1
  179.         SACL I                * Increment I
  180.         BANZ DRLOOP
  181. *
  182. *  FFT complete.
  183. *
  184. WHOA    B WHOA
  185. *
  186. * Coefficient table (size of table is 3n/4).
  187. *
  188. SINE EQU $
  189.       DATA 0
  190.       DATA 3211
  191.       DATA 6392
  192.       DATA 9511
  193.       DATA 12539
  194.       DATA 15446
  195.       DATA 18204
  196.       DATA 20787
  197.       DATA 23169
  198.       DATA 25329
  199.       DATA 27244
  200.       DATA 28897
  201.       DATA 30272
  202.       DATA 31356
  203.       DATA 32137
  204.       DATA 32609
  205. COSINE EQU $
  206.       DATA 32767
  207.       DATA 32609
  208.       DATA 32137
  209.       DATA 31356
  210.       DATA 30272
  211.       DATA 28897
  212.       DATA 27244
  213.       DATA 25329
  214.       DATA 23169
  215.       DATA 20787
  216.       DATA 18204
  217.       DATA 15446
  218.       DATA 12539
  219.       DATA 9511
  220.       DATA 6392
  221.       DATA 3211
  222.       DATA 0
  223.       DATA -3211
  224.       DATA -6392
  225.       DATA -9511
  226.       DATA -12539
  227.       DATA -15446
  228.       DATA -18204
  229.       DATA -20787
  230.       DATA -23169
  231.       DATA -25329
  232.       DATA -27244
  233.       DATA -28897
  234.       DATA -30272
  235.       DATA -31356
  236.       DATA -32137
  237.       DATA -32609
  238.       END
  239.